package collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/*
 * 使用sort()方法堆 集合中存放自定义类 排序
 * */
public class SortListDemo2 {
    public static void main(String[] args) {
        List<Point> list = new ArrayList<>();
        list.add(new Point(1, 2));
        list.add(new Point(54, 94));
        list.add(new Point(5, 16));
        list.add(new Point(15, 5));
        System.out.println("list排序前:" + list);

        /*
            编译不通过的原因:
            该sort方法要求元素必须实现Comparable接口

            不推荐Point去实现该接口，原因是这样做对我们的代码产生了侵入性
            侵入性:
            当我们使用某个API的方法，该方法要求我们为其实现接口，继承类并重写方法
            等操作(就是我们要额外修改其他地方的代码)。
            侵入性是不利于后期代码的维护的，应当尽量避免。
        */
//        Collections.sort(list,);   //此代码是编译不通过的

        /*
         * 比较器：
         * 如果想使用sort方法对自己定义的类进行排序,并且自己的类不想继承comperale接口重写方法时
         * 可以创建一个比较器的匿名内部类进行比较规则的定义
         * */
        //为point(自己创建的类)定义一个比较规则:点到原点长的大
        //此处泛型为了 指定为那个类进行定义规则
        /*Comparator<Point> c = new Comparator<Point>() {  //匿名内部类 当程序中需要使用某一个类的某一个方法 但是只会使用一次时就可以创建一个匿名内部类
            //定义了一个 比较Point类的不同两个对象中的x的平方+y的平方值的规则
            @Override
            public int compare(Point o1, Point o2) {
                //计算o1距离
                int len1 = o1.getX()*o1.getX()+o1.getY()+o1.getY();
                //计算o2距离
                int len2 = o2.getX()*o2.getX()+o2.getY()+o2.getY();
                *//*
         * 当前方法的返回值为int类型 返回值的意义为
         * o1>o2：返回大于0的数字
         * o1>o2: 返回小于0的数字
         * o1=o2 返回0
         * *//*
                return len1-len2;
            }
        };
        //list是需要排序的集合 c是自己定义的排序规则
        //重载的sort方法会根据我们传入的排序规则将list集合元素两两进行比较，然后根据大小关系进行从小到大的排序
        Collections.sort(list,c);*/

        //把整个匿名内部类的对象都作为一个参数传入到sort方法当中，减少代码的侵入性
        Collections.sort(list, new Comparator<Point>() {
            @Override
            public int compare(Point o1, Point o2) {
                int len1 = o1.getX() * o1.getX() + o1.getY() + o1.getY();
                int len2 = o2.getX() * o2.getX() + o2.getY() + o2.getY();
                return len1 - len2;
            }
        });
        System.out.println("list排序后:" + list);
    }
}
